﻿Imports System.IO

Public Class frmMain
    'フォルダ内の全てのSSのパス
    Private AllSSPath As SortedList(Of String, DateTime)


    ''' <summary>
    ''' フォームロード時の処理
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub lblSelectedDate_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        '指定フォルダの全ての画像ファイルパスを取得
        Call SetAllSSPath(My.Settings.SSfolder)

        'SSとった日付を取得してカレンダーに太字表現
        mcal.BoldedDates = GetSSDates()

        '全日付でSSを探す
        Call ShowAllThumnail()
    End Sub

    ''' <summary>
    ''' フォルダ内の全ての画像パスをコレクションに取得
    ''' </summary>
    ''' <param name="folderPath">検索対象フォルダ</param>
    ''' <remarks></remarks>
    Private Sub SetAllSSPath(ByVal folderPath As String)
        'キー：パス名、値：日付
        AllSSPath = New SortedList(Of String, DateTime)

        '該当するSSのパスを探す
        If (Directory.Exists(folderPath)) Then
            For Each SSpath As String In Directory.GetFiles(folderPath)
                '拡張子がJPGで、"FE"で始まるファイルを取得
                If Path.GetExtension(SSpath) = ".JPG" And Path.GetFileName(SSpath).StartsWith("FE") Then
                    Call AllSSPath.Add(SSpath, DateTime.ParseExact(Path.GetFileName(SSpath).Substring(2, 8), "yyyyMMdd", Nothing))
                End If
            Next
        End If

    End Sub



    ''' <summary>
    ''' SSがとられた日付を配列として取得
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function GetSSDates() As DateTime()
        Dim dates As New ArrayList

        If Not AllSSPath Is Nothing Then
            For Each ssDate As DateTime In AllSSPath.Values
                If Not dates.Contains(ssDate) Then
                    dates.Add(ssDate)
                End If
            Next
        End If

        If dates.Count > 0 Then
            Return DirectCast(dates.ToArray(GetType(DateTime)), DateTime())
        Else
            Return Nothing
        End If

    End Function


    ''' <summary>
    ''' カレンダーで日付を選択すると、サムネを更新。
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub mcal_DateChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DateRangeEventArgs) Handles mcal.DateChanged
        '指定フォルダの全ての画像ファイルパスを取得
        Call SetAllSSPath(My.Settings.SSfolder)

        'SSとった日付を取得してカレンダーに太字表現
        mcal.BoldedDates = GetSSDates()

        If rbYear.Checked Then
            Call ShowThumnailByDate(mcal.SelectionStart.AddDays(-mcal.SelectionStart.DayOfYear + 1), _
                                    mcal.SelectionStart.AddDays(-mcal.SelectionStart.DayOfYear).AddYears(1))
        ElseIf rbMonth.Checked Then
            Call ShowThumnailByDate(mcal.SelectionStart.AddDays(-mcal.SelectionStart.Day + 1), _
                                    mcal.SelectionStart.AddDays(-mcal.SelectionStart.Day + 1).AddMonths(1).AddDays(-1))
        ElseIf rbDay.Checked Then
            Call ShowThumnailByDate(mcal.SelectionStart, mcal.SelectionStart)
        End If
    End Sub

    ''' <summary>
    ''' "１年分"ボタン押下時の挙動
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub rbYear_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbYear.CheckedChanged
        '指定フォルダの全ての画像ファイルパスを取得
        Call SetAllSSPath(My.Settings.SSfolder)

        'SSとった日付を取得してカレンダーに太字表現
        mcal.BoldedDates = GetSSDates()

        If rbYear.Checked Then
            Call ShowThumnailByDate(mcal.SelectionStart.AddDays(-mcal.SelectionStart.DayOfYear + 1), _
                                    mcal.SelectionStart.AddDays(-mcal.SelectionStart.DayOfYear).AddYears(1))
        End If
    End Sub

    ''' <summary>
    ''' "ひとつき分"ボタン押下時の挙動
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub rbMonth_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbMonth.CheckedChanged
        '指定フォルダの全ての画像ファイルパスを取得
        Call SetAllSSPath(My.Settings.SSfolder)

        'SSとった日付を取得してカレンダーに太字表現
        mcal.BoldedDates = GetSSDates()

        If rbMonth.Checked Then
            Call ShowThumnailByDate(mcal.SelectionStart.AddDays(-mcal.SelectionStart.Day + 1), _
                                    mcal.SelectionStart.AddDays(-mcal.SelectionStart.Day + 1).AddMonths(1).AddDays(-1))
        End If
    End Sub

    ''' <summary>
    ''' "１日分"ボタン押下時の挙動
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub rbDay_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbDay.CheckedChanged
        '指定フォルダの全ての画像ファイルパスを取得
        Call SetAllSSPath(My.Settings.SSfolder)

        'SSとった日付を取得してカレンダーに太字表現
        mcal.BoldedDates = GetSSDates()

        If rbDay.Checked Then
            Call ShowThumnailByDate(mcal.SelectionStart, mcal.SelectionStart)
        End If
    End Sub

    ''' <summary>
    ''' サムネに表示するSSを日付で検索して表示する関数
    ''' </summary>
    ''' <param name="Sdate">SSを探す開始日</param>
    ''' <param name="Edate">SSを探す終了日</param>
    ''' <remarks></remarks>
    Private Sub ShowThumnailByDate(ByVal Sdate As Date, ByVal Edate As Date)
        Dim result() As String = Nothing
        Dim j As Integer = 0

        If Not AllSSPath Is Nothing AndAlso AllSSPath.Count > 0 Then
            With AllSSPath

                For i As Integer = 0 To .Count - 1
                    If .Values(i) >= Sdate AndAlso .Values(i) <= Edate Then
                        ReDim Preserve result(j)
                        result(j) = .Keys(i)
                        j += 1
                    End If

                Next
                ReDim Preserve result(j - 1)
            End With

        End If

        Call AddThumnail(result)
    End Sub


    ''' <summary>
    ''' サムネに全ファイルを表示する関数
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub ShowAllThumnail()
        Dim result() As String = Nothing

        If Not AllSSPath Is Nothing AndAlso AllSSPath.Count > 0 Then
            For i As Integer = 0 To AllSSPath.Count - 1
                ReDim Preserve result(i)
                result(i) = AllSSPath.Keys(i)
            Next
        End If

        Call AddThumnail(result)
    End Sub

    ''' <summary>
    ''' 全SSをサムネ表示するボタン
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub btnShowAll_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnShowAll.Click
        '指定フォルダの全ての画像ファイルパスを取得
        Call SetAllSSPath(My.Settings.SSfolder)

        'SSとった日付を取得してカレンダーに太字表現
        mcal.BoldedDates = GetSSDates()

        Call ShowAllThumnail()
    End Sub


    ''' <summary>
    ''' dgvThumnail に画像を追加する。
    ''' </summary>
    ''' <param name="imgPath">画像パスの配列</param>
    ''' <remarks></remarks>
    Private Sub AddThumnail(ByVal imgPath As String())
        Dim imgColumn() As DataGridViewImageColumn

        If Not imgPath Is Nothing AndAlso imgPath.Length > 0 Then
            ReDim imgColumn(imgPath.Length - 1)

            With dgvThumnail
                .ColumnCount = 1
                .RowCount = 1
                .Rows(0).Height = 110

                For i As Integer = 0 To imgColumn.Length - 1
                    If Not imgPath(i) Is Nothing Then
                        imgColumn(i) = New DataGridViewImageColumn
                        '画像を設定
                        imgColumn(i).Image = Image.FromFile(imgPath(i))
                        '画像をセルサイズにフィット
                        imgColumn(i).ImageLayout = DataGridViewImageCellLayout.Zoom
                        '列名に画像のパスを設定
                        imgColumn(i).Name = imgPath(i)
                        '列追加
                        Call .Columns.Add(imgColumn(i))
                    End If

                Next
                '１列目は空なので削除
                Call .Columns.RemoveAt(0)
                'とりあえず１列目のサムネをpbMainに設定
                If .ColumnCount > 0 Then
                    Call SetPbmainImg(.Columns(0).Name)
                End If
            End With
        Else
            With dgvThumnail
                .Columns.Clear()
                Call .Refresh()
                Call SetPbmainImg("")
            End With
        End If
    End Sub


    ''' <summary>
    ''' サムネ選択時にpbMainの画像を変更する
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub dgvThumnail_CellEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvThumnail.CellEnter
        With dgvThumnail
            If e.ColumnIndex > -1 Then
                Call SetPbmainImg(.Columns(e.ColumnIndex).Name)
            End If
        End With
    End Sub

    ''' <summary>
    ''' pbMainに画像を設定する関数
    ''' </summary>
    ''' <param name="path">画像のパス</param>
    ''' <remarks></remarks>
    Private Sub SetPbmainImg(ByVal path As String)

        If File.Exists(path) Then
            pbMain.ImageLocation = path
        Else
            pbMain.ImageLocation = ""
        End If

    End Sub

    ''' <summary>
    ''' 表示画像からのドラッグ＆ファイル保存
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub pbMain_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pbMain.MouseDown
        'コピー元ファイルは、表示画像のファイル
        Dim path As String = pbMain.ImageLocation

        If File.Exists(path) Then
            '画像ファイル名の入ったstring型配列を作る
            Dim fileNames As String() = {path}
            'ファイルドロップ形式でDataObjectオブジェクトを作成する
            Dim dataObj As New DataObject(DataFormats.FileDrop, fileNames)
            'さらにビットマップ形式でも格納する
            dataObj.SetData(DataFormats.Bitmap, Image.FromFile(fileNames(0)))
            'ドラッグを開始する
            pbMain.DoDragDrop(dataObj, DragDropEffects.Copy)
        End If

    End Sub

    ''' <summary>
    ''' SSフォルダの選択。
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub btnSSfolder_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSSfolder.Click
        If MsgBox("今ここ： " & My.Settings.SSfolder, MsgBoxStyle.OkCancel) = MsgBoxResult.Ok Then
            With fbdSSfolder
                If .ShowDialog = Windows.Forms.DialogResult.OK Then
                    'フォルダ変更
                    My.Settings.SSfolder = .SelectedPath
                    '指定フォルダの全ての画像ファイルパスを取得
                    Call SetAllSSPath(My.Settings.SSfolder)
                    'SSとった日付を取得してカレンダーに太字表現
                    mcal.BoldedDates = GetSSDates()

                    '全日付でSSを探す
                    Call ShowAllThumnail()
                End If
            End With
        End If
    End Sub

 

End Class
